package leetcode.other;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
 * @author cyt
 * @create 2020-09-11 10:27
 */
public class T216 {
    static List<Integer> temp = new ArrayList<Integer>();
    static List<List<Integer>> ans = new ArrayList<List<Integer>>();

    /**
     * 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数，并且每种组合中不存在重复的数字。
     *
     * @param args
     */
    public static void main(String[] args) {
        dfs(1, 3, 7);
        for (List<Integer> list : ans) {
            for (Integer integer : list) {
                System.out.println(integer + " ");
            }
            System.out.println();
        }
    }

    public List<List<Integer>> combinationSum3(int k, int n) {
        return Collections.emptyList();
    }

    static public void dfs(int cnt, int k, int n) {
        // 剪枝：temp 长度加上区间 [cur, n] 的长度小于 k，不可能构造出长度为 k 的 temp
        if (temp.size() + (n - cnt + 1) < k) {
            return;
        }
        Integer sum = temp.stream().reduce(0, Integer::sum);
        if (sum == n) {
            ans.add(new ArrayList<>(temp));
            return;
        }
        // 考虑选择当前位置
        temp.add(cnt);
        dfs(cnt + 1, n, k);
        temp.remove(temp.size() - 1);
        // 考虑不选择当前位置
        dfs(cnt + 1, n, k);
    }
}
